﻿using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using ImpExpData.Interface;
using Common;

namespace ImpExpData.Presenter
{
    class ImportPresenter
    {
        private IImportForm _view;
        private Thread thread;
        private delegate bool CheckDelegate();
        private delegate void GoMethod();

        private delegate void SetInteger(int i);
        private delegate void SetString(string str);
        
        
        private bool GetBoolParameter(CheckDelegate callback)
        {
            return (bool)((Control)_view).Invoke(callback);
        }

        public ImportPresenter(IImportForm view)
        {
            _view = view;
            _view.StartImportData += StartLoad;
            _view.AbortImportData += AbortLoad;
        }

        private List<ImportData> BuildLoadList()
        {
            List<ImportData> importData = new List<ImportData>();
            string file;
            string path = Settings.GetInstance().ImportPath;

            if (GetBoolParameter(() => _view.IsAllGoods))
            {
                //Groups
                ImportDataTable importTable = new ImportDataTable();
                importTable.Name = "Групи товарів";
                file = path + "\\Groups.xml";
                importTable.FileName = file;
                importTable.TableName = "Groups";
                importData.Add(importTable);


                //TradeMarks
                importTable = new ImportDataTable();
                importTable.Name = "Торгові марки";
                file = path + "\\Trademarks.xml";
                importTable.FileName = file;
                importTable.TableName = "Trademarks";
                importData.Add(importTable);


                //Goods
                ImportDataTableZero importGoods = new ImportDataTableZero();
                importGoods.Name = "Товари";
                importGoods.ColumnByZero = "Remaining";
                file = path + "\\Goods.xml";
                importGoods.FileName = file;
                importGoods.TableName = "Goods";
                importData.Add(importGoods);
            }
            else if (GetBoolParameter(() => _view.IsRemaining))
            {
                ImportColumnsZero importGoods = new ImportColumnsZero();
                importGoods.Columns = new string[] { "IdGood", "Remaining" };
                importGoods.Name = "Залишки товарів";
                importGoods.ColumnByZero = "Remaining";
                file = path + "\\Remaining.xml";
                importGoods.FileName = file;
                importGoods.TableName = "Goods";
                importData.Add(importGoods);
            }

            if (GetBoolParameter(() => _view.IsBuyers))
            {
                //Buyers
                ImportDataTable importTable = new ImportDataTable();
                importTable.Name = "Список клієнтів";
                file = path + "\\Buyers.xml";
                importTable.FileName = file;
                importTable.TableName = "Buyers";
                importData.Add(importTable);

                //BuyPoint
                importTable = new ImportDataTable();
                importTable.Name = "Торгові точки";
                file = path + "\\BuyPoints.xml";
                importTable.FileName = file;
                importTable.TableName = "BuyPoints";
                    importData.Add(importTable);
            }           

            if (GetBoolParameter(() => _view.IsDebts))
            {
                //DEBTS
            }
            return importData;
        }

        private void LoadData()
        {

            List<ImportData> importData = BuildLoadList();
            

            ((Control) _view).Invoke(new SetInteger(_view.SetStatusMax), importData.Count);
            ((Control)_view).Invoke(new SetInteger(_view.SetStatusPosition), 0);
            int status = 0;
            foreach (ImportData import in importData)
            {
                try
                {
                    ((Control)_view).Invoke(new SetString(_view.SetStatusLabel), import.Name);
                    if (!File.Exists(import.FileName))
                    {
                        ((Control)_view).Invoke(new SetString(_view.AddLogListBox), string.Format("{0} - Помилка відсутній файл", import.Name));
                        if (MessageBox.Show(string.Format("Незнайдено Файлу {0} продовжувати ?", import.FileName), "Незнайдено файлу",
                                        MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                        {
                            ((Control)_view).Invoke(new GoMethod(_view.ErrorData));
                            return;
                        }
                    }
                    else
                    {
                        import.LoadData();
                        ((Control)_view).Invoke(new SetString(_view.AddLogListBox), string.Format("{0} - Завантажено", import.Name));
                        //if (!Settings.GetInstance().IsSaveFiles)
                        //    File.Delete(import.FileName);
                        //else
                        //    File.Move(import.FileName, Settings.GetInstance().ArcImportPath
                    }
                    status++;
                    ((Control) _view).Invoke(new SetInteger(_view.SetStatusPosition), status);
                }
                catch(Exception)
                {
                    ((Control)_view).Invoke(new SetString(_view.AddLogListBox), string.Format("{0} - Помилка при завантаженні", import.Name));
                    if (MessageBox.Show(string.Format("Помилка при завантаженні {0} файлу {1} таблиці {2} продовжити ?", import.Name, import.FileName, import.TableName), string.Empty, MessageBoxButtons.YesNo, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button2) == DialogResult.No) 
                    {
                        ((Control)_view).Invoke(new GoMethod(_view.ErrorData));
                        return;
                    }
                }
            }
            ((Control)_view).Invoke(new GoMethod(_view.EndData));
        }

        public void AbortLoad (object sender, EventArgs e)
        {
            thread.Abort();
            _view.ErrorData();
        }

        public void StartLoad(object sender, EventArgs e)
        {
            thread = new Thread(new ThreadStart(LoadData));
            thread.IsBackground = true;
            thread.Start();
        }
    }
}
